home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kolekce / d3456 / gmprintsuite_eval.exe / {app} / GmThumbnails.pas < prev    next >
Pascal/Delphi Source File  |  2002-01-10  |  27KB  |  954 lines

  1. {******************************************************************************}
  2. {                                                                              }
  3. {                            TGmThumbnails 2.3                                 }
  4. {                                                                              }
  5. {           Copyright (c) 2001 Graham Murt  - www.MurtSoft.com                 }
  6. {                                                                              }
  7. {   Feel free to e-mail me with any comments, suggestions, bugs or help at:    }
  8. {                                                                              }
  9. {                           graham@murtsoft.com                                }
  10. {                                                                              }
  11. {******************************************************************************}
  12.  
  13. unit GmThumbnails;
  14.  
  15. interface
  16.  
  17. uses
  18.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  19.   extctrls, stdctrls, GmPreview, GmTypes, GmErrors, GmConst, Menus, ComCtrls;
  20.  
  21. type
  22.   // events...
  23.     TOnThumbMouseDown = procedure (Sender: TObject; Button: TMouseButton;
  24.     Shift: TShiftState; APage: TGmPage) of object;
  25.  
  26.   TGmThumbNailLayout = (gmThumbHorz, gmThumbVert, gmThumbGrid);
  27.  
  28.   TGmThumbnails = class;
  29.  
  30.   // *** TGmThumbnailPage ***
  31.   TGmThumbnailPage = class(TGmCustomPage)
  32.   private
  33.     FSelected: Boolean;
  34.     function GetThumbnails: TGmThumbnails;
  35.   protected
  36.     procedure Click; override;
  37.     procedure Paint; override;
  38.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  39.   public
  40.     constructor Create(AOwner: TComponent); override;
  41.   end;
  42.  
  43.  
  44.   // *** TGmThumbnail ***
  45.   TGmThumbnail = class(TWinControl)
  46.   private
  47.     FPage: TGmThumbnailPage;
  48.     FlblPageNum: TLabel;
  49.     FOrientation: TGmOrientation;
  50.     FPageNum: integer;
  51.     FPreview: TGmPreview;
  52.     FShowCaption: Boolean;
  53.     FThumbSize: integer;
  54.     function GetCaptionHeight: integer;
  55.     function GetThumbnails: TGmThumbnails;
  56.     procedure SetCaption(const ACaption: string);
  57.     procedure SetPageNum(APageNum: integer);
  58.     procedure SetShowCaption(AShowCaption: Boolean);
  59.     procedure SetThumbSize(AThumbSize: integer);
  60.   public
  61.     constructor Create(AOwner: TComponent); override;
  62.     destructor Destroy; override;
  63.     procedure LabelClick(Sender: TObject);
  64.     procedure Repaint; override;
  65.     property PageNum: integer read FPageNum write SetPageNum;
  66.     property Page: TGmThumbnailPage read FPage write FPage;
  67.     property ShowCaption: Boolean read FShowCaption write SetShowCaption;
  68.     property ThumbSize: integer read FThumbSize write SetThumbSize;
  69.   end;
  70.  
  71.   TGmThumbnailList = class(TList)
  72.   private
  73.     FThumbnails: TGmThumbnails;
  74.     function AddThumb: TGmThumbnail;
  75.     function GetNumThumbs: integer;
  76.     function GetThumbnail(APageNum: integer): TGmThumbnail;
  77.     procedure DeleteThumb(APageNum: integer);
  78.     procedure SetThumbnail(APageNum: integer; AThumbnail: TGmThumbnail);
  79.     { Private declarations }
  80.   protected
  81.     { Protected declarations }
  82.   public
  83.     constructor Create(AOwner: TComponent);
  84.     destructor Destroy; override;
  85.     procedure Clear; {$IFNDEF VER100} override; {$ENDIF}
  86.     property Thumbnail[APageNum: integer]: TGmThumbnail read GetThumbnail write SetThumbnail;
  87.     { Public declarations }
  88.   published
  89.     { Published declarations }
  90.   end;
  91.  
  92.   TGmProgressPanel = class(TCustomPanel)
  93.   private
  94.     FProgressBar: TProgressBar;
  95.   public
  96.     constructor Create(AOwner: TComponent); override;
  97.     destructor Destroy; override;
  98.     procedure Init;
  99.     procedure SetPercent(Percent: integer);
  100.   end;
  101.  
  102.   TGmThumbnails = class(TScrollingWinControl)
  103.   private
  104.     FBorderStyle: TBorderStyle;
  105.     FEnabled: Boolean;
  106.     FGridWidth: integer;
  107.     FItemIndex: integer;
  108.     FHighlight: Boolean;
  109.     FLayout: TGmThumbNailLayout;
  110.     FLoadingUpdate: Boolean;
  111.     FPageCaption: string;
  112.     FPreview: TGmPreview;
  113.     //FProgressBar: TProgressBar;
  114.     //FProgressPercent: TLabel;
  115.     FProgressPanel: TGmProgressPanel;
  116.     FScrollIntoView: Boolean;
  117.     FShadow: TGmShadow;
  118.     FShowCaption: Boolean;
  119.     FShowProgress: Boolean;
  120.     FThumbList: TGmThumbnailList;
  121.     FThumbPopup: TPopupMenu;
  122.     FThumbSize: integer;
  123.     FTempValue: Boolean;
  124.     // events...
  125.     FOnThumbClick: TOnThumbMouseDown;
  126.     function AddThumb: TGmThumbnail;
  127.     function GetShadow: TGmShadow;
  128.     procedure DeleteLastThumb;
  129.     procedure DeleteThumb(APageNum: integer);
  130.     procedure SetBorderStyle(AStyle: TBorderStyle);
  131.     procedure SetGridWidth(AGridWidth: integer);
  132.     procedure SetItemIndex(AIndex: integer);
  133.     procedure SetHighlight(AValue: Boolean);
  134.     procedure SetLayout(ALayout: TGmThumbNailLayout);
  135.     procedure SetPageCaption(const ACaption: string);
  136.     procedure SetPreview(APreview: TGmPreview);
  137.     procedure SetShowCaption(AShowCaption: Boolean);
  138.     procedure SetThumbSize(AThumbSize: integer);
  139.     procedure SetThumbPopup(APopup: TPopupMenu);
  140.     procedure ShadowChanged(Sender: TObject);
  141.   protected
  142.     function SelectedPageNum: integer;
  143.     procedure CreateParams(var Params: TCreateParams); override;
  144.     procedure NumPagesChanged(var Message: TMessage); message GM_NUMPAGES_CHANGED;
  145.     procedure OrientationChanged(var Message: TMessage); message GM_ORIENTATION_CHANGED;
  146.     procedure PageChanged(var Message: TMessage); message GM_PAGE_CHANGED;
  147.     procedure PageUpdated(var Message: TMessage); message GM_PAGE_UPDATED;
  148.     procedure PageOrientationChanged(var Message: TMessage); message GM_PAGE_ORIENTATION_CHANGED;
  149.     procedure PaperSizeChanged(var Message: TMessage); message GM_PAPER_SIZE_CHANGED;
  150.     procedure PreviewCleared(var Message: TMessage); message GM_PREVIEW_CLEARED;
  151.     procedure PreviewLoading(var Message: TMessage); message GM_LOADING;
  152.     procedure ResizeThumbnails;
  153.     procedure ScrollToThumb;
  154.     procedure SetEnabled(AEnabled: Boolean); {$IFNDEF VER100} override; {$ENDIF}
  155.     procedure HideAll;
  156.     procedure ShowAll;
  157.     procedure SyncronizePages(ANumPages: integer);
  158.     procedure RepositionThumbnails(DisplayProgress: Boolean);
  159.   public
  160.     constructor Create(AOwner: TComponent); override;
  161.     destructor Destroy; override;
  162.  
  163.     procedure UpdateThumbnails;
  164.     // private...
  165.     procedure RedrawThumbs;
  166.     property ItemIndex: integer read FItemIndex write SetItemIndex;
  167.   published
  168.     {properties available from Delphi 4...}
  169.     {$IFNDEF VER100}
  170.     property Anchors;
  171.     property Constraints;
  172.     {$ENDIF}
  173.     property Align;
  174.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
  175.     property Color;
  176.     property Enabled: Boolean read FEnabled write SetEnabled;
  177.     property GridWidth: integer read FGridWidth write SetGridWidth default 4;
  178.     property Highlight: boolean read FHighlight write SetHighlight default True;
  179.     property Layout: TGmThumbNailLayout read FLayout write SetLayout default gmThumbHorz;
  180.     property PageCaptions: string read FPageCaption write SetPageCaption;
  181.     property Preview: TGmPreview read FPreview write SetPreview;
  182.     property ScrollIntoView: Boolean read FScrollIntoView write FScrollIntoView default True;
  183.     property Shadow: TGmShadow read GetShadow;
  184.     property ShowCaption: Boolean read FShowCaption write SetShowCaption default True;
  185.     property ShowProgress: Boolean read FShowProgress write FShowProgress default False;
  186.     property ShowHint;
  187.     property TabOrder;
  188.     property ThumbSize: integer read FThumbSize write SetThumbSize default 4;
  189.     property ThumbPopup: TPopupMenu read FThumbPopup write SetThumbPopup;
  190.     property Visible;
  191.     property UpdateWhileLoading: Boolean read FLoadingUpdate write FLoadingUpdate default False;
  192.     // events...
  193.     property OnThumbMouseDown: TOnThumbMouseDown read FOnThumbClick write FOnThumbClick;
  194.   end;
  195.  
  196. implementation
  197.  
  198. //------------------------------------------------------------------------------
  199.  
  200. // TGmThumbnailPage...
  201.  
  202. constructor TGmThumbnailPage.Create(AOwner: TComponent);
  203. begin
  204.   inherited;
  205.   FSelected := False;
  206. end;
  207.  
  208. function TGmThumbnailPage.GetThumbnails: TGmThumbnails;
  209. var
  210.   AThumbnail: TGmThumbnail;
  211. begin
  212.   AThumbnail := TGmThumbnail(Owner);
  213.   Result := TGmThumbnails(AThumbnail.Owner);
  214. end;
  215.  
  216. procedure TGmThumbnailPage.Click;
  217. var
  218.   AThumbnail: TGmThumbnail;
  219. begin
  220.   AThumbnail := TGmThumbnail(Owner);
  221.   GetThumbnails.FPreview.CurrentPage := AThumbnail.PageNum;
  222. end;
  223.  
  224. procedure TGmThumbnailPage.Paint;
  225. begin
  226.   inherited;
  227.   if (FSelected) and (GetThumbnails.Highlight) then
  228.   begin
  229.     Canvas.Pen.Color := clBlue;
  230.     Canvas.Brush.Style := bsClear;
  231.     Canvas.Rectangle(PageRect.Left, PageRect.Top, PageRect.Right, PageRect.Bottom);
  232.   end;
  233. end;
  234.  
  235. procedure TGmThumbnailPage.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  236. var
  237.   APreview: TGmPreview;
  238.   ItemIndex: integer;
  239. begin
  240.   inherited;
  241.   APreview := GetThumbnails.Preview;
  242.   ItemIndex := GetThumbnails.ItemIndex;
  243.   if Assigned(GetThumbnails.FOnThumbClick) then
  244.     GetThumbnails.FOnThumbClick(Self, Button, Shift, APreview.Pages[ItemIndex+1]);
  245. end;
  246.  
  247. //------------------------------------------------------------------------------
  248.  
  249. // TGmThumbnail routines...
  250.  
  251. constructor TGmThumbnail.Create(AOwner: TComponent);
  252. begin
  253.   inherited Create(AOwner);
  254.   FPage := TGmThumbnailPage.Create(Self);
  255.   FlblPageNum := TLabel.Create(Self);
  256.   FShowCaption := TGmThumbnails(AOwner).ShowCaption;
  257.   FPage.Parent := Self;
  258.   FPreview := TGmThumbnails(AOwner).Preview;
  259.   //SetThumbSize(5);
  260.   FlblPageNum.AutoSize := False;
  261.   FlblPageNum.Left := 0;
  262.   FlblPageNum.Align := alBottom;
  263.   FlblPageNum.Alignment := taCenter;
  264.   FlblPageNum.Parent := Self;
  265.   FlblPageNum.OnClick := LabelClick;
  266. end;
  267.  
  268. destructor TGmThumbnail.Destroy;
  269. begin
  270.   FPage.Free;
  271.   FlblPageNum.Free;
  272.   inherited Destroy;
  273. end;
  274.  
  275. procedure TGmThumbnail.LabelClick(Sender: TObject);
  276. begin
  277.   FPage.Click;
  278. end;
  279.  
  280. procedure TGmThumbnail.Repaint;
  281. begin
  282.   inherited;
  283.   if (FPage.FSelected) and (GetThumbnails.Highlight) then
  284.     FlblPageNum.Font.Color := clBlue
  285.   else
  286.     FlblPageNum.Font.Color := clBlack;
  287. end;
  288.  
  289. function TGmThumbnail.GetCaptionHeight: integer;
  290. begin
  291.  // if FShowCaption then
  292.     Result := 18
  293.   //else
  294.   //  Result := 0;
  295. end;
  296.  
  297. function TGmThumbnail.GetThumbnails: TGmThumbnails;
  298. begin
  299.   Result := TGmThumbnails(Owner);
  300. end;
  301.  
  302. procedure TGmThumbnail.SetCaption(const ACaption: string);
  303. var
  304.   TokenizedCaption: string;
  305.   TokenIndex: integer;
  306. begin
  307.   TokenizedCaption := ACaption;
  308.   while Pos('#', TokenizedCaption) > 0 do
  309.   begin
  310.     TokenIndex := Pos('#', TokenizedCaption);
  311.     Delete(TokenizedCaption, TokenIndex, 1);
  312.     Insert(IntToStr(FPageNum), TokenizedCaption, TokenIndex);
  313.   end;
  314.   FlblPageNum.Caption := TokenizedCaption;
  315. end;
  316.  
  317. procedure TGmThumbnail.SetPageNum(APageNum: integer);
  318. begin
  319.   FPageNum := APageNum;
  320. end;
  321.  
  322. procedure TGmThumbnail.SetShowCaption(AShowCaption: Boolean);
  323. begin
  324.   FlblPageNum.Visible := AShowCaption;
  325.   //GetThumbnails.SyncronizePages(GetThumbnails.Preview.NumPages);
  326.   SetThumbSize(FThumbSize);
  327. end;
  328.  
  329. procedure TGmThumbnail.SetThumbSize(AThumbSize: integer);
  330. var
  331.   ThumbHeight,
  332.   ThumbWidth : integer;
  333.   CaptionHeight: integer;
  334.   AShadowWidth: integer;
  335. begin
  336.   CaptionHeight := GetCaptionHeight;
  337.   //if FThumbSize <> AThumbSize then
  338.   begin
  339.   FThumbSize := AThumbSize;
  340.   AShadowWidth := FPage.Shadow.Width;
  341.   ThumbWidth   := Round((FPreview.PageWidth.AsMillimeters  / 20) * (FThumbSize+1));
  342.   ThumbHeight  := Round((FPreview.PageHeight.AsMillimeters / 20) * (FThumbSize+1));
  343.  
  344.   if FOrientation <> FPreview.Orientation then
  345.   begin
  346.     SwapValues(ThumbWidth, ThumbHeight);
  347.  
  348.   end;
  349.   Width := ThumbWidth+AShadowWidth +8;
  350.   Height := ThumbHeight+CaptionHeight+AShadowWidth +8;
  351.   end;
  352.   FPage.SetBounds(4,4,Width-(8-FPage.Shadow.Width), (Height-CaptionHeight)-(8-FPage.Shadow.Width));
  353. end;
  354.  
  355.  
  356.  
  357. //------------------------------------------------------------------------------
  358.  
  359. // *** TGmThumbnailList ***
  360.  
  361. constructor TGmThumbnailList.Create(AOwner: TComponent);
  362. begin
  363.   inherited Create;
  364.   FThumbnails := TGmThumbnails(AOwner);
  365. end;
  366.  
  367. destructor TGmThumbnailList.Destroy;
  368. begin
  369.   Clear;
  370.   inherited Destroy;
  371. end;
  372.  
  373. procedure TGmThumbnailList.Clear;
  374. var
  375.   ICount: integer;
  376. begin
  377.   for ICount := GetNumThumbs downto 1 do
  378.     DeleteThumb(ICount);
  379. end;
  380.  
  381. procedure TGmThumbnailList.DeleteThumb(APageNum: integer);
  382. begin
  383.   TGmThumbnail(Self[APageNum-1]).Free;
  384.   Self.Delete(APageNum-1);
  385. end;
  386.  
  387. procedure TGmThumbnailList.SetThumbnail(APageNum: integer; AThumbnail: TGmThumbnail);
  388. begin
  389.   Self[APageNum-1] := AThumbnail;
  390. end;
  391.  
  392. function TGmThumbnailList.AddThumb: TGmThumbnail;
  393. begin
  394.   Result := TGmThumbnail.Create(FThumbnails);
  395.   Add(Result);
  396.   Result.PageNum := Count;
  397. end;
  398.  
  399. function TGmThumbnailList.GetNumThumbs: integer;
  400. begin
  401.   Result := Count;
  402. end;
  403.  
  404. function TGmThumbnailList.GetThumbnail(APageNum: integer): TGmThumbnail;
  405. begin
  406.   Result := TGmThumbnail(Self[APageNum-1])
  407. end;
  408.  
  409. //------------------------------------------------------------------------------
  410.  
  411. // *** TGmProgressPanel ***
  412.  
  413. constructor TGmProgressPanel.Create(AOwner: TComponent);
  414. begin
  415.   inherited Create(AOwner);
  416.   Height := 36;
  417.   BorderWidth := 9;
  418.   FProgressBar := TProgressBar.Create(Self);
  419.   FProgressBar.Align := alClient;
  420.   FProgressBar.Parent := Self;
  421.   Init;
  422. end;
  423.  
  424. destructor TGmProgressPanel.Destroy;
  425. begin
  426.   FProgressBar.Free;
  427.   inherited Destroy;
  428. end;
  429.  
  430. procedure TGmProgressPanel.Init;
  431. begin
  432.   FProgressBar.Position := 0;
  433.   FProgressBar.Max := 100;
  434. end;
  435.  
  436. procedure TGmProgressPanel.SetPercent(Percent: integer);
  437. begin
  438.   FProgressBar.Position := Percent;
  439.   Repaint;
  440. end;
  441.  
  442. //------------------------------------------------------------------------------
  443.  
  444. // *** TGmThumbnails ***
  445.  
  446. constructor TGmThumbnails.Create(AOwner: TComponent);
  447. begin
  448.   inherited Create(AOwner);
  449.   FThumbList := TGmThumbnailList.Create(Self);
  450.   FBorderStyle := bsSingle;
  451.   FEnabled := True;
  452.   FHighlight := True;
  453.   FProgressPanel := TGmProgressPanel.Create(Self);
  454.   FShadow := TGmShadow.Create(Self);
  455.   FShadow.OnChange := ShadowChanged;
  456.   FShowCaption := True;
  457.   FShowProgress := False;
  458.   FLayout := gmThumbHorz;
  459.   FGridWidth := 4;
  460.   FPageCaption := 'Page #';
  461.   FScrollIntoView := True;
  462.   FThumbSize := 4;
  463.   FLoadingUpdate := False;
  464.   Width := 265;
  465.   Height := 120;
  466. end;
  467.  
  468. destructor TGmThumbnails.Destroy;
  469. begin
  470.   if Assigned(FPreview) then FPreview.RemoveAssociatedComponent(Self);
  471.   FProgressPanel.Free;
  472.   FThumbList.Free;
  473.   inherited Destroy;
  474. end;
  475.  
  476. procedure TGmThumbnails.CreateParams(var Params: TCreateParams);
  477. const
  478.   BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
  479. begin
  480.   inherited CreateParams(Params);
  481.   with Params do
  482.   begin
  483.     Style := Style or BorderStyles[FBorderStyle];
  484.     if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
  485.     begin
  486.       Style := Style and not WS_BORDER;
  487.       ExStyle := ExStyle or WS_EX_CLIENTEDGE;
  488.     end;
  489.   end;
  490. end;
  491.  
  492. function TGmThumbnails.SelectedPageNum: integer;
  493. begin
  494.   Result := FPreview.CurrentPage;
  495. end;
  496.  
  497. procedure TGmThumbnails.NumPagesChanged(var Message: TMessage);
  498. begin
  499.   if FEnabled then
  500.   begin
  501.     SyncronizePages(Message.WParam);
  502.     RepositionThumbnails(FShowProgress);
  503.   end;
  504. end;
  505.  
  506. procedure TGmThumbnails.PageChanged(var Message: TMessage);
  507. var
  508.   ICount: integer;
  509.   APage: TGmThumbnail;
  510. begin
  511.   if (FEnabled) then
  512.   begin
  513.     FItemIndex := Message.WParam-1;
  514.     for ICount := 1 to FThumbList.GetNumThumbs do
  515.     begin
  516.       APage := FThumbList.Thumbnail[ICount];
  517.       if APage.FPage.FSelected then
  518.       begin
  519.         APage.FPage.FSelected := False;
  520.         APage.Repaint;
  521.       end;
  522.     end;
  523.     APage := FThumbList.Thumbnail[FItemIndex+1];
  524.     APage.FPage.FSelected := True;
  525.     APage.Repaint;
  526.     ScrollToThumb;
  527.   end;
  528. end;
  529.  
  530. procedure TGmThumbnails.PageUpdated(var Message: TMessage);
  531. begin
  532.   if FEnabled then
  533.   begin
  534.     if FThumbList.GetNumThumbs <> FPreview.NumPages then
  535.     begin
  536.       FEnabled := False;
  537.       SetEnabled(True);
  538.     end;
  539.     FThumbList.Thumbnail[Message.WParam].Repaint;
  540.   end;
  541. end;
  542.  
  543. procedure TGmThumbnails.OrientationChanged(var Message: TMessage);
  544. var
  545.   ICount: integer;
  546. begin
  547.   if FEnabled then
  548.   begin
  549.     for ICount := 1 to FThumbList.GetNumThumbs do
  550.       FThumbList.Thumbnail[ICount].FOrientation := FPreview.Orientation;
  551.     HideAll;
  552.     ResizeThumbnails;
  553.     RepositionThumbnails(FShowProgress);
  554.   end;
  555. end;
  556.  
  557. procedure TGmThumbnails.PageOrientationChanged(var Message: TMessage);
  558. begin
  559.   if FEnabled then
  560.   begin
  561.     FThumbList.Thumbnail[Message.WParam].FOrientation := FPreview.Pages[Message.WParam].Orientation;
  562.     FThumbList.Thumbnail[Message.WParam].SetThumbSize(FThumbSize);
  563.     RepositionThumbnails(FShowProgress);
  564.   end;
  565. end;
  566.  
  567. procedure TGmThumbnails.PaperSizeChanged(var Message: TMessage);
  568. begin
  569.   if FEnabled then
  570.   begin
  571.    UpdateThumbnails;
  572.   end;
  573. end;
  574.  
  575. procedure TGmThumbnails.PreviewCleared(var Message: TMessage);
  576. begin
  577.   if FEnabled then
  578.   begin
  579.     FThumbList.Clear;
  580.     DisableAutoRange;
  581.     SyncronizePages(1);
  582.     FThumbList.Thumbnail[1].Page.FSelected := True;
  583.     RepositionThumbnails(False);
  584.     EnableAutoRange;
  585.   end;
  586. end;
  587.  
  588. procedure TGmThumbnails.PreviewLoading(var Message: TMessage);
  589. begin
  590.   if Message.WParam = 0 then
  591.   begin
  592.     // start of loading...
  593.     if (not FLoadingUpdate) then
  594.     begin
  595.       FTempValue := FEnabled;
  596.       FEnabled := False;
  597.     end;
  598.   end
  599.   else
  600.   if Message.WParam = 1 then
  601.   begin
  602.     // end of loading...
  603.     if (not FLoadingUpdate) then
  604.     begin
  605.       Enabled := FTempValue;
  606.     end;
  607.   end;
  608. end;
  609.  
  610. procedure TGmThumbnails.RedrawThumbs;
  611. var
  612.   ICount: integer;
  613. begin
  614.   FPreview.MessagesEnabled := False;
  615.   for ICount := 1 to FThumbList.GetNumThumbs do
  616.   begin
  617.     FPreview.Pages[ICount].DrawPage;
  618.     FThumbList.Thumbnail[ICount].FPage.SetPageMetafile(FPreview.Metafile[ICount], True);
  619.   end;
  620.   FPreview.MessagesEnabled := True;
  621. end;
  622.  
  623. procedure TGmThumbnails.SetBorderStyle(AStyle: TBorderStyle);
  624. begin
  625.   if FBorderStyle <> AStyle then
  626.   begin
  627.     FBorderStyle := AStyle;
  628.     RecreateWnd;
  629.   end;
  630. end;
  631.  
  632. procedure TGmThumbnails.SetEnabled(AEnabled: Boolean);
  633. begin
  634.   inherited;
  635.   if FEnabled <> AEnabled then
  636.   begin
  637.     FEnabled := AEnabled;
  638.     UpdateThumbnails;
  639.   end;
  640. end;
  641.  
  642.  
  643.  
  644. procedure TGmThumbnails.HideAll;
  645. var
  646.   ICount: integer;
  647. begin
  648.   for ICount := 1 to FThumbList.GetNumThumbs do
  649.     FThumbList.Thumbnail[ICount].Parent := nil;
  650. end;
  651.  
  652. procedure TGmThumbnails.ShowAll;
  653. var
  654.   ICount: integer;
  655. begin
  656.   for ICount := FThumbList.GetNumThumbs downto 1 do
  657.     FThumbList.Thumbnail[ICount].visible := True;
  658. end;
  659.  
  660. procedure TGmThumbnails.UpdateThumbnails;
  661. var
  662.   PageNum: integer;
  663. begin
  664.   if (FEnabled) and (Assigned(FPreview)) then
  665.   begin
  666.     SyncronizePages(FPreview.NumPages);
  667.     RedrawThumbs;
  668.     RepositionThumbnails(FShowProgress);
  669.     PageNum := FPreview.CurrentPage;
  670.     SendMessage(Self.Handle, GM_PAGE_CHANGED, PageNum, 0);
  671.   end;
  672. end;
  673.  
  674.  
  675. procedure TGmThumbnails.SetGridWidth(AGridWidth: integer);
  676. begin
  677.   FGridWidth := AGridWidth;
  678.   if FLayout = gmThumbGrid then
  679.     RepositionThumbnails(FShowProgress);
  680. end;
  681.  
  682. procedure TGmThumbnails.SetItemIndex(AIndex: integer);
  683. begin
  684.   if (AIndex <> FItemIndex) and (AIndex >= 0) and (AIndex < FThumbList.GetNumThumbs) then
  685.   begin
  686.     SendMessage(Self.Handle, GM_PAGE_CHANGED, AIndex+1, 0);
  687.   end;
  688. end;
  689.  
  690. procedure TGmThumbnails.SetHighlight(AValue: Boolean);
  691. begin
  692.   if FHighlight <> AValue then
  693.   begin
  694.     FHighLight := AValue;
  695.     FThumbList.Thumbnail[ItemIndex+1].Repaint;
  696.   end;
  697. end;
  698.  
  699. procedure TGmThumbnails.SetLayout(ALayout: TGmThumbNailLayout);
  700. begin
  701.   if FLayout <> ALayout then
  702.   begin
  703.     FLayout := ALayout;
  704.     RepositionThumbnails(FShowProgress);
  705.   end;
  706. end;
  707.  
  708. procedure TGmThumbnails.SetPageCaption(const ACaption: string);
  709. var
  710.   ICount: integer;
  711. begin
  712.   if FPageCaption <> ACaption then
  713.   begin
  714.     FPageCaption := ACaption;
  715.     for ICount := 1 to FThumbList.GetNumThumbs do
  716.       FThumbList.Thumbnail[ICount].SetCaption(FPageCaption);
  717.   end;
  718. end;
  719.  
  720. procedure TGmThumbnails.SetPreview(APreview: TGmPreview);
  721. begin
  722.   if Assigned(APreview) then
  723.   begin
  724.     FPreview := APreview;
  725.     FPreview.AddAssociatedComponent(Self);
  726.     if FEnabled then
  727.     begin
  728.       SyncronizePages(FPreview.NumPages);
  729.       FThumbList.Thumbnail[FPreview.CurrentPage].FPage.FSelected := True;
  730.       FThumbList.Thumbnail[FPreview.CurrentPage].Repaint;
  731.       RepositionThumbnails(FShowProgress);
  732.     end;
  733.   end
  734.   else
  735.     FPreview := nil;
  736. end;
  737.  
  738. procedure TGmThumbnails.SetShowCaption(AShowCaption: Boolean);
  739. var
  740.   ICount: integer;
  741. begin
  742.   for ICount := 1 to FThumbList.GetNumThumbs do
  743.     FThumbList.Thumbnail[ICount].ShowCaption := AShowCaption;
  744. end;
  745.  
  746. function TGmThumbnails.AddThumb: TGmThumbnail;
  747. begin
  748.   Result := FThumbList.AddThumb;
  749.   Result.FOrientation := FPreview.Orientation;
  750.   Result.SetThumbSize(FThumbSize);
  751.   Result.Page.SetPageMetafile(FPreview.MetaFile[Result.PageNum], True);
  752.   Result.PopupMenu := FThumbPopup;
  753.   Result.SetCaption(FPageCaption);
  754. end;
  755.  
  756. procedure TGmThumbnails.ResizeThumbnails;
  757. var
  758.   ICount: integer;
  759. begin
  760.   if FEnabled then
  761.   begin
  762.     for ICount := 1 to FThumbList.GetNumThumbs do
  763.       FThumbList.Thumbnail[ICount].SetThumbSize(FThumbSize);
  764.   end;
  765. end;
  766.  
  767. procedure TGmThumbnails.ScrollToThumb;
  768. begin
  769.   if (FScrollIntoView) and (FItemIndex <> -1) then
  770.     ScrollInView(FThumbList.Thumbnail[FItemIndex+1]);
  771. end;
  772.  
  773. function TGmThumbnails.GetShadow: TGmShadow;
  774. begin
  775.   Result := FShadow;
  776. end;
  777.  
  778. procedure TGmThumbnails.DeleteLastThumb;
  779. begin
  780.   DeleteThumb(FThumbList.Count);
  781. end;
  782.  
  783. procedure TGmThumbnails.DeleteThumb(APageNum: integer);
  784. begin
  785.   FThumbList.DeleteThumb(APageNum);
  786. end;
  787.  
  788. procedure TGmThumbnails.RepositionThumbnails;
  789. var
  790.   ICount: integer;
  791.   AThumbnail: TGmThumbnail;
  792.   CurrentX,
  793.   CurrentY: integer;
  794.   CurrentCol,
  795.   //HorzPos, VertPos: integer;
  796.   RowHeight: integer;
  797.   NumThumbs: integer;
  798.   LastPercent: integer;
  799. begin
  800.   if FEnabled then
  801.   begin
  802.     NumThumbs := FThumbList.GetNumThumbs;
  803.     CurrentX := 0;
  804.     CurrentY := 0;
  805.     LastPercent := 0;
  806.  
  807.     HorzScrollBar.Position := 0;
  808.     VertScrollBar.Position := 0;
  809.  
  810.     //Autoscroll := False;
  811.     DisableAutoRange;
  812.  
  813.     if DisplayProgress then
  814.     with FProgressPanel do
  815.     begin
  816.       Top := (Self.Height div 2) -10;
  817.       Width := Self.ClientWidth - 32;
  818.       Left := 16;
  819.       Ctl3D := False;
  820.       Init;
  821.       Parent := Self;
  822.       Repaint;
  823.     end;
  824.  
  825.     HideAll;
  826.  
  827.     case FLayout of
  828.       gmThumbHorz:
  829.         begin
  830.           for ICount := 1 to NumThumbs do
  831.           begin
  832.             AThumbnail := FThumbList.Thumbnail[ICount];
  833.             AThumbnail.SetBounds(CurrentX, 0, AThumbnail.Width, AThumbnail.Height);
  834.             Inc(CurrentX, AThumbnail.Width);
  835.             AThumbnail.Parent := Self;
  836.             Application.ProcessMessages;
  837.  
  838.             if (DisplayProgress) and (LastPercent <> Round((ICount/NumThumbs)*100)) then
  839.             begin
  840.               LastPercent := Round((ICount/NumThumbs)*100);
  841.               FProgressPanel.BringToFront;
  842.               FProgressPanel.SetPercent(LastPercent);
  843.             end;
  844.           end;
  845.         end;
  846.       gmThumbVert:
  847.         begin
  848.  
  849.           for ICount := 1 to NumThumbs do
  850.           begin
  851.             AThumbnail := FThumbList.Thumbnail[ICount];
  852.             AThumbnail.Parent := nil;
  853.             AThumbnail.SetBounds(0, CurrentY, AThumbnail.Width, AThumbnail.Height);
  854.             Inc(CurrentY, AThumbnail.Height);
  855.             AThumbnail.Parent := Self;
  856.             Application.ProcessMessages;
  857.  
  858.             if (DisplayProgress) and (LastPercent <> Round((ICount/NumThumbs)*100)) then
  859.             begin
  860.               LastPercent := Round((ICount/NumThumbs)*100);
  861.               FProgressPanel.BringToFront;
  862.               FProgressPanel.SetPercent(LastPercent);
  863.             end;
  864.           end;
  865.         end;
  866.       gmThumbGrid:
  867.         begin
  868.           CurrentCol := 1;
  869.           RowHeight := 1;
  870.           for ICount := 1 to NumThumbs do
  871.           begin
  872.             AThumbnail := FThumbList.Thumbnail[ICount];
  873.             AThumbnail.SetBounds(CurrentX, CurrentY, AThumbnail.Width, AThumbnail.Height);
  874.             Inc(CurrentX, AThumbnail.Width);
  875.             AThumbnail.Parent := Self;
  876.             Application.ProcessMessages;
  877.  
  878.             RowHeight := MaxInt(RowHeight, AThumbnail.Height);
  879.             Inc(CurrentCol);
  880.             if CurrentCol > FGridWidth then
  881.             begin
  882.               CurrentCol := 1;
  883.               CurrentX := 0;
  884.               Inc(CurrentY, RowHeight);
  885.               RowHeight := 1;
  886.             end;
  887.             if (DisplayProgress) and (LastPercent <> Round((ICount/NumThumbs)*100)) then
  888.             begin
  889.               LastPercent := Round((ICount/NumThumbs)*100);
  890.               FProgressPanel.BringToFront;
  891.               FProgressPanel.SetPercent(LastPercent);
  892.             end;
  893.           end;
  894.         end;
  895.       end;
  896.       FProgressPanel.Parent := nil;
  897.  
  898.  
  899.   end;
  900.  
  901.   EnableAutoRange;
  902.   //AutoScroll := True;
  903. end;
  904.  
  905. procedure TGmThumbnails.SyncronizePages(ANumPages: integer);
  906. var
  907.   ICount: integer;
  908. begin
  909.   if FEnabled then
  910.   begin
  911.     if FThumbList.Count < ANumPages then
  912.       while FThumbList.Count < ANumPages do
  913.       with AddThumb do
  914.       begin
  915.         ICount := FThumbList.Count;
  916.         FThumbList.Thumbnail[ICount].FOrientation := FPreview.Pages[ICount].Orientation;
  917.         FThumbList.Thumbnail[ICount].FPage.Shadow.Assign(FShadow);
  918.         FThumbList.Thumbnail[ICount].FlblPageNum.Visible := ShowCaption;
  919.       end
  920.     else
  921.     if FThumbList.Count > ANumPages then
  922.       while FThumbList.Count > ANumPages do
  923.         DeleteLastThumb;
  924.   end;
  925. end;
  926.  
  927. procedure TGmThumbnails.SetThumbSize(AThumbSize: integer);
  928. var
  929.   ICount: integer;
  930. begin
  931.   FThumbSize := AThumbSize;
  932.   for ICount := 1 to FThumbList.GetNumThumbs do
  933.     FThumbList.Thumbnail[ICount].SetThumbSize(FThumbSize);
  934.   RepositionThumbnails(FShowProgress);
  935. end;
  936.  
  937. procedure TGmThumbNails.SetThumbPopup(APopup: TPopupMenu);
  938. var
  939.   ICount: integer;
  940. begin
  941.   for ICount := 1 to FThumbList.GetNumThumbs do
  942.     FThumbList.Thumbnail[ICount].FPage.PopupMenu := APopup;
  943.   FThumbPopup := APopup;
  944. end;
  945.  
  946. procedure TGmThumbnails.ShadowChanged(Sender: TObject);
  947. begin
  948.   if Assigned(FPreview) then
  949.     SyncronizePages(FPreview.NumPages);
  950. end;
  951.  
  952. end.
  953.  
  954.